package com.jokerku.mini.schedule.util;


import javax.management.MBeanServer;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.management.Query;
import java.lang.management.ManagementFactory;
import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.Random;
import java.util.Set;

/**
 * @Author: guzq
 * @CreateTime: 2023/06/01 17:25
 * @Description: Ip工具类
 * @Version: 1.0
 */
public class IPUtil {

    public static Integer getLocalPort() {
//        MBeanServer beanServer = ManagementFactory.getPlatformMBeanServer();
//        Set<ObjectName> objectNames;
//        try {
//            objectNames = beanServer.queryNames(new ObjectName("*:type=Connector,*"), Query.match(Query.attr("protocol"), Query.value("HTTP/1.1")));
//        } catch (MalformedObjectNameException e) {
//            return null;
//        }
//        String port;
//        try {
//            port = objectNames.iterator().next().getKeyProperty("port");
//        } catch (NoSuchElementException e) {
//            return null;
//        }
//        Integer portInt = null;
//        if (StringUtils.isNotEmpty(port)) {
//            portInt = Integer.valueOf(port);
//        }
//        return portInt;
        int port = 0;
        try {
            MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
            ObjectName name = new ObjectName("Catalina", "type", "Server");
            Object server = mBeanServer.getAttribute(name, "managedResource");
            name = new ObjectName(server + ":type=Service,*");
            Set<ObjectName> objectNames = mBeanServer.queryNames(name, null);
            Iterator<ObjectName> it = objectNames.iterator();
            while (it.hasNext()) {
                ObjectName on = it.next();
                String protocol = (String) mBeanServer.getAttribute(on, "protocol");
                if ("HTTP/1.1".equals(protocol)) {
                    port = (Integer) mBeanServer.getAttribute(on, "port");
                    break;
                }
            }
        } catch (Exception e) {
            // 处理异常
        }

        return port;
    }

    /**
     * 获取随机ip
     * @return
     */
    public static String getRandomIp() {
        // 指定 IP 范围
        int[][] range = {
                {607649792, 608174079}, // 36.56.0.0-36.63.255.255
                {1038614528, 1039007743}, // 61.232.0.0-61.237.255.255
                {1783627776, 1784676351}, // 106.80.0.0-106.95.255.255
                {2035023872, 2035154943}, // 121.76.0.0-121.77.255.255
                {2078801920, 2079064063}, // 123.232.0.0-123.235.255.255
                {-1950089216, -1948778497}, // 139.196.0.0-139.215.255.255
                {-1425539072, -1425014785}, // 171.8.0.0-171.15.255.255
                {-1236271104, -1235419137}, // 182.80.0.0-182.92.255.255
                {-770113536, -768606209}, // 210.25.0.0-210.47.255.255
                {-569376768, -564133889}, // 222.16.0.0-222.95.255.255
        };

        Random random = new Random();
        int index = random.nextInt(10);
        return num2ip(range[index][0] + random.nextInt(range[index][1] - range[index][0]));
    }

    /**
     * 将十进制转换成IP地址
     */
    public static String num2ip(int ip) {
        int[] b = new int[4];
        b[0] = (ip >> 24) & 0xff;
        b[1] = (ip >> 16) & 0xff;
        b[2] = (ip >> 8) & 0xff;
        b[3] = ip & 0xff;
        // 拼接 IP
        return b[0] + "." + b[1] + "." + b[2] + "." + b[3];
    }


    public static String getAppointIP() {
        return "210.44.206.195";
//        return "61.234.165.60";
//        return "31.541.571.401";
    }
}